package tech.aistar.design.singleton;

/**
 * 本类用来演示: 双重锁检测 - 为了解决懒汉模式在多线程场景下不安全
 *
 * @author: success
 * @date: 2022/7/22 3:45 下午
 */
public class Singleton03 {
    //2. 提供本类的唯一的实例作为它的静态属性
    private static Singleton03 instance;

    //1. 私有化构造 - 为了不让外界去new
    private Singleton03(){
        //初始化的业务...
        System.out.println("构造方法...");
    }

    //3. 提供一个公开的方法来返回这个类的唯一实例
    //不建议这样写的原因.若干个线程同时在调用getInstance方法
    //T1 - getInstance方法 - 假设竞争"锁资源" - 对象 - 申请到了,才会进去执行
    //T1执行完结束,自动释放锁资源

    //T2... Tn 会继续争抢getInstance - > "锁"
    //导致后面的线程频繁去申请锁 - "重量级的对象 - 比较消耗资源"
    //public synchronized static Singleton03 getInstance(){
    //    return instance==null?instance=new Singleton03():instance;
    //}
    public static Singleton03 getInstance(){
        //防止后面的线程再去频繁竞争"锁"
        if(null==instance){//T1,T2 = > null
            synchronized (Singleton03.class){//T2在等待
                //只能由一个线程进入 - 同步代码块
                //T1进入了...
                if(null==instance){
                    instance = new Singleton03();
                }
            }
        }
        return instance;
    }
}
